package com.yuandian.management.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuandian.api.management.entity.ConfMpReturnCode;
import com.yuandian.api.management.po.ConfMpReturnCodeParams;
import com.yuandian.bpm.common.core.util.R;
import com.yuandian.management.mapper.ConfMpReturnCodeMapper;
import com.yuandian.management.service.ConfMpReturnCodeService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 中台监控-返回码配置表-Service实现
 * @author zfsn
 * @date 2023-4-23
 */
@Service
public class ConfMpReturnCodeServiceImpl extends ServiceImpl<ConfMpReturnCodeMapper, ConfMpReturnCode>
		implements ConfMpReturnCodeService {

	/**
	 * 分页查询
	 * @param params 中台监控-返回码配置请求参数
	 * @return 通用返回对象
	 */
	@Override
	public R<Page<ConfMpReturnCode>> page(ConfMpReturnCodeParams params) {
		Page<ConfMpReturnCode> page = Page.of(params.getCurrent(), params.getSize());
		page.addOrder(params.orders()).orders().forEach(orderItem -> orderItem.setColumn(StrUtil.toUnderlineCase(orderItem.getColumn())));
		return R.ok(lambdaQuery()
				.eq(params.getServiceId() != null, ConfMpReturnCode::getServiceId, params.getServiceId())
				.eq(StrUtil.isNotEmpty(params.getType()), ConfMpReturnCode::getType, params.getType())
				.like(StrUtil.isNotEmpty(params.getName()), ConfMpReturnCode::getName, params.getName())
				.eq(StrUtil.isNotEmpty(params.getStatus()), ConfMpReturnCode::getStatus, params.getStatus())
				.page(page));
	}

	/**
	 * 新增数据
	 * @param params 中台监控-返回码配置请求参数
	 * @return 通用返回对象
	 */
	@Transactional(rollbackFor = Exception.class)
	@Override
	public R<Boolean> saveWrap(ConfMpReturnCodeParams params) {
		ConfMpReturnCode confMpReturnCode = BeanUtil.copyProperties(params, ConfMpReturnCode.class);
		save(confMpReturnCode);
		return R.ok(Boolean.TRUE, "新增成功");
	}

	/**
	 * 通过主键更新数据
	 * @param params 中台监控-返回码配置请求参数
	 * @return 通用返回对象
	 */
	@Transactional(rollbackFor = Exception.class)
	@Override
	public R<Boolean> updateByIdWrap(ConfMpReturnCodeParams params) {
		// 1、校验请求参数
		Integer id = params.getId();
		if (id == null) {
			return R.failed("更新失败，返回码id不能为空！");
		}
		// 2、通过id获取返回码配置
		ConfMpReturnCode returnCodeById = getById(id);
		// 3、校验该配置是否存在
		if (ObjectUtil.isNull(returnCodeById)) {
			return R.failed("更新失败，不存在该返回码配置！");
		}
		// 4、更新返回码配置
		BeanUtil.copyProperties(params, returnCodeById);
		updateById(returnCodeById);
		return R.ok(Boolean.TRUE, "更新成功");
	}

	/**
	 * 通过主键删除数据
	 * @param idList 主键集合
	 * @return 通用返回对象
	 */
	@Transactional(rollbackFor = Exception.class)
	@Override
	public R<Boolean> removeByIdsWrap(List<Integer> idList) {
		// 1、校验请求参数
		if (CollUtil.isEmpty(idList)) {
			return R.failed("删除失败，主键集合不能为空");
		}
		// 2、删除返回码配置
		removeByIds(idList);
		return R.ok(Boolean.TRUE, "删除成功");
	}

	/**
	 * 根据服务id集合删除服务下的所有返回码配置
	 * @param serviceIdList 服务id集合
	 * @return 通用返回对象
	 */
	@Override
	public R<Boolean> removeByServiceIds(List<Integer> serviceIdList) {
		return R.ok(lambdaUpdate().in(CollUtil.isNotEmpty(serviceIdList), ConfMpReturnCode::getServiceId, serviceIdList).remove());
	}
}